// Package _2_rotate_array_set offer_11_rotate_min_array
// @Title _2_rotate_array_set
// @Description  剑指 Offer 11. 旋转数组的最小数字
// @Author  == 琳琳也叫王木木 ==  2021/9/15 17:41
// @Create  2021/9/15 17:41
package _2_rotate_array_set

/**
旋转数组系列中，常见的三种情况

对于数组的最后一个元素x
情况一：中点 大于 最右  ==>> 那么旋转点一定在 右半部分  [M+1,j]
情况二: 重点小于最右  ==>> 旋转点一定在左半部分   [i,m]
情况三: 中点== 最右  无法判断  执行j = j-1

直到就 i==j 时候 跳出二分查询 返回旋转点的值
*/

//旋转数组的最小值
func MinArray(numbers []int) int {
	low := 0
	high := len(numbers) - 1
	for low < high {
		pivot := low + (high-low)/2
		if numbers[pivot] < numbers[high] {
			high = pivot
		} else if numbers[pivot] > numbers[high] {
			low = pivot + 1
		} else {
			high--
		}
	}
	return numbers[low]
}
